/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.edu.fatec.ads.bo;

import br.edu.fatec.ads.classes.Autor;
import br.edu.fatec.ads.classes.Livro;
import br.edu.fatec.ads.dao.HibernateGenericDAO;
import br.edu.fatec.ads.util.ComboBoxItem;
import br.edu.fatec.ads.util.CriteriosUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;

/**
 *
 * @author Ubirajara
 */
public class BusinessObjectAutor implements IBusinessObject{

    private HibernateGenericDAO dao = null;

    public BusinessObjectAutor() {
        dao = new HibernateGenericDAO(Autor.class);
    }

    public void beginTransaction(){
        dao.beginTransaction();
    }

    public void commitTransaction(){
        dao.commitTransaction();
    }

    public void rollbackTransaction(){
        dao.rollbackTransaction();
    }

    public void clearSession() {
        dao.clearSession();
    }

    public List<Autor> recuperarTodosAutores(){
        return dao.findByCriterion(null);
    }

    public Autor recuperarAutor(int codigo){
        return (Autor) dao.get(codigo);
    }
    
    public List<ComboBoxItem> recuperarComboAutores(List<Autor> autores){
        List<ComboBoxItem> comboItems = new ArrayList<ComboBoxItem>();
        ComboBoxItem auxiliar = null;

        if(autores != null && !autores.isEmpty()){
            for (Autor autor : autores) {
                auxiliar = new ComboBoxItem(autor.getCodigo(), autor.getNome());

                comboItems.add(auxiliar);
            }
        }

        return comboItems;
    }

    public List<Autor> recuperarAutores(List<ComboBoxItem> autores){
        List<Autor> autoresRecuperados = Collections.EMPTY_LIST;
        List<Integer> codigos = new ArrayList<Integer>();

        Map<String, Object> criteriosBusca = new HashMap<String, Object>();
        Map<String, Object> campoValores = new HashMap<String, Object>();

        if(autores != null && !autores.isEmpty()){
            for (ComboBoxItem autor : autores) {
                codigos.add(autor.getCodigo());
            }

            campoValores.put("codigo", codigos);
            criteriosBusca.put(CriteriosUtil.CRITERIOS_IN, campoValores);

            List<Criterion> criteriosConvertidos = CriteriosUtil.getInstance().montaCriterios(criteriosBusca);

            autoresRecuperados = dao.findByCriterion(criteriosConvertidos);
        }

        return autoresRecuperados;
    }

    public List<Livro> recuperarLivrosPorAutor(int codigoAutor)
        throws HibernateException{
        List<Livro> livrosRecuperados = Collections.EMPTY_LIST;
        Autor autorPesquisado = null;

        autorPesquisado = (Autor) dao.get(codigoAutor);
        
        Hibernate.initialize(autorPesquisado.getLivros());

        livrosRecuperados = autorPesquisado.getLivros();
        
        return livrosRecuperados;
    }


}